@echo off
setlocal enabledelayedexpansion

:: 部署脚本，用于在Windows环境中部署支付服务应用

:: 显示帮助信息
if "%1"=="-h" goto :show_help
if "%1"=="--help" goto :show_help

:: 默认值
set DEPLOY_ENV=dev
set IMAGE_TAG=latest
set DOCKER_REGISTRY=registry.example.com
set APP_PORT=8080
set DATA_PATH=D:\data\payservice

:: 解析命令行参数
:parse_args
if "%1"=="" goto :end_parse_args
if "%1"=="-e" (
    set DEPLOY_ENV=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="--env" (
    set DEPLOY_ENV=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="-t" (
    set IMAGE_TAG=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="--tag" (
    set IMAGE_TAG=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="-r" (
    set DOCKER_REGISTRY=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="--registry" (
    set DOCKER_REGISTRY=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="-p" (
    set APP_PORT=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="--port" (
    set APP_PORT=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="-d" (
    set DATA_PATH=%2
    shift
    shift
    goto :parse_args
)
if "%1"=="--data-path" (
    set DATA_PATH=%2
    shift
    shift
    goto :parse_args
)
echo 未知选项: %1
goto :show_help
:end_parse_args

:: 验证环境参数
if not "%DEPLOY_ENV%"=="dev" if not "%DEPLOY_ENV%"=="test" if not "%DEPLOY_ENV%"=="uat" if not "%DEPLOY_ENV%"=="prod" (
    echo 错误: 不支持的环境 '%DEPLOY_ENV%'
    echo 支持的环境: dev, test, uat, prod
    exit /b 1
)

:: 设置环境特定的配置
if "%DEPLOY_ENV%"=="dev" (
    set MYSQL_ROOT_PASSWORD=123456
    set MYSQL_USER=root
    set MYSQL_PASSWORD=123456
    set REDIS_PASSWORD=
    set JAVA_OPTS=-Xms512m -Xmx1g
)
if "%DEPLOY_ENV%"=="test" (
    set MYSQL_ROOT_PASSWORD=test_password
    set MYSQL_USER=test_user
    set MYSQL_PASSWORD=test_password
    set REDIS_PASSWORD=
    set JAVA_OPTS=-Xms1g -Xmx2g
)
if "%DEPLOY_ENV%"=="uat" (
    set MYSQL_ROOT_PASSWORD=uat_password
    set MYSQL_USER=uat_user
    set MYSQL_PASSWORD=uat_password
    set REDIS_PASSWORD=uat_redis_password
    set JAVA_OPTS=-Xms2g -Xmx4g
)
if "%DEPLOY_ENV%"=="prod" (
    set MYSQL_ROOT_PASSWORD=prod_password
    set MYSQL_USER=prod_user
    set MYSQL_PASSWORD=prod_password
    set REDIS_PASSWORD=prod_redis_password
    set JAVA_OPTS=-Xms4g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
)

:: 设置数据路径
set LOG_PATH=%DATA_PATH%\logs
set MYSQL_DATA_PATH=%DATA_PATH%\mysql
set REDIS_DATA_PATH=%DATA_PATH%\redis
set MYSQL_INIT_PATH=.\db

:: 创建必要的目录
if not exist "%LOG_PATH%" mkdir "%LOG_PATH%"
if not exist "%MYSQL_DATA_PATH%" mkdir "%MYSQL_DATA_PATH%"
if not exist "%REDIS_DATA_PATH%" mkdir "%REDIS_DATA_PATH%"

echo 开始部署支付服务应用...
echo 环境: %DEPLOY_ENV%
echo 镜像标签: %IMAGE_TAG%
echo 应用端口: %APP_PORT%
echo 数据路径: %DATA_PATH%

:: 设置环境变量，供docker-compose使用
set DB_USERNAME=%MYSQL_USER%
set DB_PASSWORD=%MYSQL_PASSWORD%
set MYSQL_DATABASE=payservice
set MYSQL_PORT=3306
set REDIS_PORT=6379
set DATA_CENTER_ID=1
set WORKER_ID=1

:: 拉取最新镜像
echo 拉取最新镜像...
docker pull %DOCKER_REGISTRY%/payservice:%IMAGE_TAG%

:: 使用docker-compose部署应用
echo 部署应用...
docker-compose -f script\docker-compose-deploy.yml -p payservice down
docker-compose -f script\docker-compose-deploy.yml -p payservice up -d

:: 检查应用是否成功启动
echo 检查应用状态...
timeout /t 10 /nobreak > nul
docker ps | findstr "payservice" > nul
if %errorlevel% equ 0 (
    echo 应用已成功启动
    echo 访问地址: http://localhost:%APP_PORT%/api
) else (
    echo 应用启动失败，请检查日志
    docker-compose -f script\docker-compose-deploy.yml -p payservice logs
    exit /b 1
)

echo 部署完成
goto :eof

:show_help
echo 支付服务部署脚本
echo 用法: %0 [选项]
echo 选项:
echo   -e, --env ENV          指定部署环境 (dev, test, uat, prod), 默认: dev
echo   -t, --tag TAG          指定镜像标签, 默认: latest
echo   -r, --registry URL     指定Docker镜像仓库地址, 默认: registry.example.com
echo   -p, --port PORT        指定应用端口, 默认: 8080
echo   -d, --data-path PATH   指定数据存储路径, 默认: D:\data\payservice
echo   -h, --help             显示帮助信息
echo.
echo 示例:
echo   %0 --env dev --tag v1.0.0
echo   %0 --env prod --tag v1.0.0 --port 9090
exit /b 0 